﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Constructor.Controls
{
    public partial class ObjectExplorer : UserControl
    {
        TreeNode prot;
        TreeNode sit;
        TreeNode select_node = null;
        public ObjectExplorer()
        {
            InitializeComponent();
            prot = treeView.Nodes.Add("Прототипы");
            sit = treeView.Nodes.Add("Ситуации");
        }
        public void Fill()
        {
            prot.Nodes.Clear();
            sit.Nodes.Clear();
            foreach (Frame f in External.frames)
            {
                TreeNode node = null;
                if (f.Type == CommonLib.FrameType.Prototype)
                    node = prot.Nodes.Add(f.Name);
                else
                    node = sit.Nodes.Add(f.Name);
                if (node != null)
                {
                    node.Tag = f;
                    f.TreeNode = node;
                    f.FillTreeNode(node);
                }
            }
            prot.Expand();
            sit.Expand();
        }
        public void AddFrame(Frame f)
        {
            switch (f.Type)
            {
                case CommonLib.FrameType.Prototype:
                    f.TreeNode = prot.Nodes.Add(f.Name);
                    f.TreeNode.Tag = f;
                    break;
                case CommonLib.FrameType.Situation:
                    f.TreeNode = sit.Nodes.Add(f.Name);
                    f.TreeNode.Tag = f;
                    break;
            }
        }
        public void ChangeGroup(TreeNode node)
        {
            if (prot.Nodes.Contains(node) && (node.Tag as Frame).Type == CommonLib.FrameType.Situation)
            {
                prot.Nodes.Remove(node);
                sit.Nodes.Add(node);
            }
            else if (sit.Nodes.Contains(node) && (node.Tag as Frame).Type == CommonLib.FrameType.Prototype)
            {
                sit.Nodes.Remove(node);
                prot.Nodes.Add(node);
            }
        }
        public void SelectNode(TreeNode node)
        {
            if (node != null)
            {
                if (select_node != null)
                    select_node.BackColor = Color.White;
                select_node = node;
                node.BackColor = Color.FromArgb(0x00, 0xCC, 0x00);
                treeView.SelectedNode = node;
            }
        }
        private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView.SelectedNode != null)
                if (treeView.SelectedNode.Tag as Frame != null)
                {
                    Frame f = treeView.SelectedNode.Tag as Frame;
                    foreach (Frame frame in External.frames)
                        if (frame.ParentFrame != null && f.Name == frame.ParentFrame.Name)
                        {
                            MessageBox.Show("У этого фрейма есть потомки. Его нельзя удалить");
                            return;
                        }
                    if (f.Name == "Поле" || f.Name == "Клетка" || f.Name == "Объект")
                        MessageBox.Show("Нельзя удалять этот фрейм");
                    else if (MessageBox.Show("Действительно удалить фрейм " + f.Name + "?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {

                        External.constructor.DeleteFrame(f);
                        treeView.Nodes.Remove(treeView.SelectedNode);
                    }
                }
                else if (treeView.SelectedNode.Tag as Slot != null)
                {
                    Slot s = treeView.SelectedNode.Tag as Slot;
                    Frame f = s.Frame;
                    if (f.Name == "Поле" || f.Name == "Клетка" || f.Name == "Объект")
                        MessageBox.Show("Нельзя удалять слоты этого фрейма");
                    else if (MessageBox.Show("Действительно удалить слот " + s.FullName + "?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        f.Slots.Remove(s);
                        treeView.Nodes.Remove(treeView.SelectedNode);
                    }

                }
        }

        private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            SelectNode(e.Node);
            External.constructor.SelectNode(select_node);
        }

        private void редактироватьСлотыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (select_node != null)
            {
                if (select_node.Tag as Frame != null)
                    new EditorSlot(select_node.Tag as Frame).ShowDialog();
                else if (select_node.Tag as Slot != null)
                    new EditorSlot((select_node.Tag as Slot).Frame, select_node.Tag as Slot).ShowDialog();
            }
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            if (select_node != null)
            {
                if (select_node.Tag as Slot != null)
                {
                    удалитьВсеСлотыToolStripMenuItem.Visible = false;
                    удалитьВсеФреймыToolStripMenuItem.Visible = false;
                    удалитьToolStripMenuItem.Visible = true;
                    редактироватьToolStripMenuItem.Visible = true;
                    редактироватьToolStripMenuItem.Enabled = (select_node.Tag as Slot).Frame.Name != "Поле";
                }
                else if (select_node.Tag as Frame != null)
                {
                    удалитьВсеСлотыToolStripMenuItem.Visible = true;
                    редактироватьToolStripMenuItem.Visible = true;
                    удалитьToolStripMenuItem.Visible = true;
                    удалитьВсеФреймыToolStripMenuItem.Visible = false;
                    редактироватьToolStripMenuItem.Enabled = (select_node.Tag as Frame).Name != "Поле";
                }
                else
                {
                    редактироватьToolStripMenuItem.Visible = false;
                    удалитьToolStripMenuItem.Visible = false;
                    удалитьВсеСлотыToolStripMenuItem.Visible = false;
                    удалитьВсеФреймыToolStripMenuItem.Visible = true;
                }
            }
        }

        private void удалитьВсеФреймыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Действительно удалить все фрейм в этой группе?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                List<TreeNode> remove = new List<TreeNode>();
                foreach (TreeNode node in select_node.Nodes)
                {
                    Frame f = node.Tag as Frame;
                    if (f != null && f.Name != "Поле" && f.Name != "Клетка" && f.Name != "Объект")
                    {
                        External.constructor.DeleteFrame(f);
                        remove.Add(node);
                    }

                }
                foreach (TreeNode node in remove)
                    select_node.Nodes.Remove(node);
                remove.Clear();
            }

        }
    }
}
